/**
 * @brief LED 控制模块
 * @version 1.0
 * @date 2018-3-18
 * @author 宋炜
 */

#ifndef __DTU_LEDS__
#define __DTU_LEDS__

#include <atomic>
#include "ql_oe.h"
#include "dial.hpp"
#include "timer.hpp"
class led
{
public:
	enum err_code{
		ERR_LED_BASE = -1100,
		ERR_LED_INIT_GPIO,
		ERR_LED_SET_LEVEL,
		OK = 0
	};

	static const Enum_PinName DOG_IO;
	static const Enum_PinName RELOAD_IO;
	static const Enum_PinName SOCKA_IO;
	static const Enum_PinName SOCKB_IO;
	static const Enum_PinName NET_IO;
	static const Enum_PinName WORK_IO;

	/* 灯的开关逻辑定义 */
	static const Enum_PinLevel LED_ON;
	static const Enum_PinLevel LED_OFF;

	static led * ledDevice;
private:
	CTimer              m_reload_timer1;			  // reload 操作下限计时器
	CTimer              m_reload_timer2;              // reload 操作上限计时器
	std::atomic< bool > m_reload_flag;                // reload 标识
	// 看门狗计时器
	CTimer              m_wait_feed_timer;
	CTimer              m_feed_timer;

	CTimer              m_net_off;
	CTimer              m_net_on;
	CTimer              m_net;
	std::atomic< bool > m_net_blink;
private:
	void init_dog_timer();
	void init_net_led_timer();
public:
	led();
    	virtual ~led();
	/**
	 * @brief 开启或者关闭SOCKA , SOCKB指示灯
	 * @param sw , ON 打开指示灯；OFF关闭指示灯，以下相同
	 */
	void socka( bool sw );
	void sockb( bool sw );
	void work( bool sw );
	/**
	 * @brief 开启或者关闭网络指示灯
	 * @param sw
	 */
	void net( int type );

	void OnReload( bool type );

	static led * GetLed()
	{
		return ledDevice;
	}
};
#endif
